
/*
@title - Javascript:将人民币数字转换成大写形式
@date - 2006-09-04
@description - 
	
	用JavaScript编写了一功能函数，完成如下功能：

	1、对一给定字符串，如：1234.55，转换成正确的中文货币描述：如：人民币壹仟贰佰叁拾四元五角五分

	2、输入的字符串形式可以是以下几种：带分隔符的，如：123,456,789.00；不带分隔符的，如：123456789

	3、输出的中文货币描述要符合规范，如：0.3----人民币三角；0.33----人民币三角三分；1----人民币壹元整
		100----人民币壹佰元整；1001----人民币壹仟零壹元整；10000001----人民币壹仟万零壹元整；
		1001001----人民币壹仟零壹万零壹元整，等

	4、最大转换能到百亿
	
@example: - 

	convertCurrency(Digits.value)

*/
function convertCurrency(currencyDigits) {
	// Constants:
	var MAXIMUM_NUMBER = 99999999999.99;
	// Predefine the radix characters and currency symbols for output:
	var CN_ZERO = "\u96f6";
	var CN_ONE = "\u58f9";
	var CN_TWO = "\u8d30";
	var CN_THREE = "\u53c1";
	var CN_FOUR = "\u8086";
	var CN_FIVE = "\u4f0d";
	var CN_SIX = "\u9646";
	var CN_SEVEN = "\u67d2";
	var CN_EIGHT = "\u634c";
	var CN_NINE = "\u7396";
	var CN_TEN = "\u62fe";
	var CN_HUNDRED = "\u4f70";
	var CN_THOUSAND = "\u4edf";
	var CN_TEN_THOUSAND = "\u4e07";
	var CN_HUNDRED_MILLION = "\u4ebf";
	var CN_SYMBOL = "";//"\u4eba\u6c11\u5e01";
	var CN_DOLLAR = "\u5143";
	var CN_TEN_CENT = "\u89d2";
	var CN_CENT = "\u5206";
	var CN_INTEGER = "\u6574"; 

	// Variables:
	var integral; // Represent integral part of digit number.
	var decimal; // Represent decimal part of digit number.
	var outputCharacters; // The output result.
	var parts;
	var digits, radices, bigRadices, decimals;
	var zeroCount;
	var i, p, d;
	var quotient, modulus; 

	// Validate input string:
	currencyDigits = currencyDigits.toString();
	if (currencyDigits === "") {
		alert("Empty input!");
		return "";
	}
	if (currencyDigits.match(/[^,.\d]/) !== null) {
		alert("Invalid characters in the input string!");
		return "";
	}
	if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) === null) {
		alert("Illegal format of digit number!");
		return "";
	} 

	// Normalize the format of input digits:
	currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
	currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
	// Assert the number is not greater than the maximum number.
	if (Number(currencyDigits) > MAXIMUM_NUMBER) {
		alert("Too large a number to convert!");
		return "";
	} 

	// Process the coversion from currency digits to characters:
	// Separate integral and decimal parts before processing coversion:
	parts = currencyDigits.split(".");
	if (parts.length > 1) {
		integral = parts[0];
		decimal = parts[1];
		// Cut down redundant decimal digits that are after the second.
		decimal = decimal.substr(0, 2);
	} else {
		integral = parts[0];
		decimal = "";
	}
	
	// Prepare the characters corresponding to the digits:
	digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);
	radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
	bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
	decimals = new Array(CN_TEN_CENT, CN_CENT);
	
	// Start processing:
	outputCharacters = "";
	
	// Process integral part if it is larger than 0:
	if (Number(integral) > 0) {
		zeroCount = 0;
		for (i = 0; i < integral.length; i = i + 1) {
			p = integral.length - i - 1;
			d = integral.substr(i, 1);
			quotient = p / 4;
			modulus = p % 4;
			if (d == "0") {
				zeroCount = zeroCount + 1;
			} else {
				if (zeroCount > 0) {
					outputCharacters += digits[0];
				}
				zeroCount = 0;
				outputCharacters += digits[Number(d)] + radices[modulus];
			}
			if (modulus === 0 && zeroCount < 4) {
				outputCharacters += bigRadices[quotient];
			}
		}
		outputCharacters += CN_DOLLAR;
	}
	
	// Process decimal part if there is:
	if (decimal !== "") {
		for (i = 0; i < decimal.length; i = i + 1) {
			d = decimal.substr(i, 1);
			if (d != "0") {
				outputCharacters += digits[Number(d)] + decimals[i];
			}
		}
	}
	
	// Confirm and return the final output string:
	if (outputCharacters === "") {
		outputCharacters = CN_ZERO + CN_DOLLAR;
	}
	if (decimal === "") {
		outputCharacters += CN_INTEGER;
	}
	outputCharacters = CN_SYMBOL + outputCharacters;
	return outputCharacters;
}

